package com.gutou.yeaicodemother.service;

import com.gutou.yeaicodemother.model.dto.app.AppAddRequest;
import com.gutou.yeaicodemother.model.dto.app.AppQueryRequest;
import com.gutou.yeaicodemother.model.entity.User;
import com.gutou.yeaicodemother.model.vo.app.AppVO;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.gutou.yeaicodemother.model.entity.App;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * 应用 服务层。
 *
 * @author 程序员骨头
 */
public interface AppService extends IService<App> {

    /**
     * 创建应用
     * @param appAddRequest
     * @param loginUser
     * @return
     */
    Long createApp(AppAddRequest appAddRequest, User loginUser);

    /**
     * 部署应用
     *
     * @param appId     应用ID，用于指定要部署的应用
     * @param loginUser 当前登录用户，用于验证权限和记录部署操作
     * @return 部署成功后的应用ID字符串，通常用于后续的API调用或展示
     */
    String deployApp(Long appId, User loginUser);

     /**
     * 异步生成应用截图
     *
     * @param appId 应用ID，用于指定要生成截图的应用
     * @param appUrl 应用URL，用于访问应用并生成截图
     */
    void generateAppScreenshotAsync(Long appId, String appUrl);

    /**
     * 与AI模型进行聊天，根据用户输入生成代码
     *
     * @param appId       应用ID，用于指定与哪个应用进行交互
     * @param userMessage 用户输入的消息，用于向AI模型咨询或请求代码生成
     * @return 生成的代码字符串，可能是HTML、多文件代码等，根据应用的配置和模型的能力而定
     */
    Flux<String> chatToGenCode(Long appId, String userMessage, User loginUser);

    /**
     * 根据App实体对象获取对应的AppVO（View Object）视图对象
     * 该方法通常用于将数据库中的App实体对象转换为前端展示用的VO对象，
     * 可能会进行一些数据处理或筛选操作。
     * @param app App实体对象，包含应用的基本信息
     * @return AppVO 视图对象，通常用于前端展示，可能包含经过处理或筛选的数据
     */
    AppVO getAppVO(App app);

    /**
     * 根据AppQueryRequest对象构建查询条件包装器（QueryWrapper）
     * 该方法用于根据AppQueryRequest对象中的查询条件，构建一个QueryWrapper对象，
     * 用于在数据库查询中使用，以实现根据条件筛选数据的功能。
     * @param appQueryRequest AppQueryRequest对象，包含查询条件
     * @return QueryWrapper 查询条件包装器，用于构建复杂的查询条件
     */
    QueryWrapper getQueryWrapper(AppQueryRequest appQueryRequest);

    /**
     * 根据App实体对象列表获取对应的AppVO（View Object）视图对象列表
     * 该方法通常用于将数据库中的App实体对象列表转换为前端展示用的VO对象列表，
     * 可能会进行一些数据处理或筛选操作。
     * @param appList App实体对象列表，包含多个应用的基本信息
     * @return List<AppVO> 视图对象列表，通常用于前端展示，可能包含经过处理或筛选的数据
     */
    List<AppVO> getAppVOList(List<App> appList);

}
